#include <map>
#include <iostream>

using namespace std;

#define N 10
#define OUT(map_a, msg) do{ \
    cout << msg; \
    for (auto i = map_a.begin(); i != map_a.end(); i++) cout << "key:" << i->first << " value:" << i->second << "  "; \
    cout << endl; \
}while(0)

int main(int argc, char const *argv[])
{
    /*****************************************************************************************************
     * multimap 容器
     * ---------------------------------------------------------------------------------------------------
     * 与 map 不同之处在于， multimap 中允许存储 键相同 的键值对
     * multimap会自动按照键对容器中的键值对进行排序
     *****************************************************************************************************/
    // -----------------------------------------------
    // --- 定义 ----
    // -----------------------------------------------
    // 默认定义
    multimap<string, string> map_a;
    // 初始化列表定义
    multimap<string, string> map_b{{"key", "value1"}, {"key", "value2"}};
    OUT(map_b, "输出：");


    // -----------------------------------------------
    // --- 增 ----
    // -----------------------------------------------
    multimap<string, string> students_c{{"key", "v11"}, {"key", "v22"}};
    students_c.insert(make_pair("key1", "value1111"));
    students_c.insert(make_pair("key1", "value2222"));
    OUT(students_c, "新增输出： ");

    // -----------------------------------------------
    // --- 删 ----
    // -----------------------------------------------
    // 注意， erase 会删除所有键相同的键值对
    students_c.erase("key1");
    OUT(students_c, "删除key1后输出： ");

    // -----------------------------------------------
    // --- 改 ----
    // -----------------------------------------------
    // 有多个相同的键时， find函数返回第一个键值对的迭代器
    multimap<string, string>::iterator stu_i = students_c.find("key");
    // multimap的键一旦确定只能删除， 无法修改， 所以不能有这样的操作： (*stu_i).first = "key_x";
    (*stu_i).second = "value_x";
    OUT(students_c, "修改值： ");
    // -----------------------------------------------
    // --- 查 ----
    // -----------------------------------------------
    multimap<string, string>::iterator stu_it = students_c.find("key");
    cout << "查找key： key=" << stu_it->first << " value=" << stu_it->second << endl;

    /*****************************************************************************************************
     * 成员函数
     * ---------------------------------------------------------------------------------------------------
     * array.begin()        返回：随机访问迭代器  首元素位置指针   
     * 
     *****************************************************************************************************/
    
    // array.begin() 
    // -----------------------------------------------
    
    
    return 0;
}
